package com.cskaoyan.object;

import java.util.Objects;

/*
        public int hashCode()
         返回当前对象的哈希码值

     hash函数定义：
        A hash function is any function that can be used
        to map data of arbitrary size onto data of fixed size.

        The values returned by a hash function are called hash values,
        hash codes or simply hashes.

    实际上，由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
    （这一般是通过将该对象的内部地址转换成一个整数来实现的，但是 JavaTM 编程语言不需要这种实现技巧。）

    hashCode 的常规协定是：

     1. 在 Java 应用程序执行期间，在对同一对象多次调用 hashCode 方法时，必须一致地返回相同的整数
         前提是将对象进行 equals 比较时所用的信息没有被修改。
         隐含的告诉我们，如何得到一个对象hashcode值: 根据对象的成员变量值计算出对象的hashcode值即可

    2. 如果根据 equals(Object) 方法，两个对象是相等的，那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
    3. 如果根据 equals(java.lang.Object) 方法，两个对象不相等，
       那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。(因为hash映射可能存在hash冲突)

       但是，程序员应该意识到，为不相等的对象生成不同整数结果可以提高哈希表的性能。
       从某一应用程序的一次执行到同一应用程序的另一次执行，该整数无需保持一致。
 */
public class Demo2Hashcode {

    public static void main(String[] args) {

        int a = 100;
        double d = 9.9;
//        HashCodeClass obj = new HashCodeClass(a, d);
//
//        int i = obj.hashCode();
//        System.out.println(i);

        int b = 1000;
        // int 基本数据类型 ——> 包装类
        Integer integer = b;

        System.out.println(integer.intValue());
        integer.hashCode();

        double dd = 9.9;
        Double doubleValue = d;

        System.out.println(doubleValue.hashCode());
    }
}

class HashCodeClass {

    int a;
    double d;

    public HashCodeClass(int a, double d) {
        this.a = a;
        this.d = d;
    }


    @Override
    public int hashCode() {
        // 确实是根据对象的成员变量值去生成对象的hashcode值
        return Objects.hash(a, d);
    }
}
